<?php

if (!defined('BASEPATH'))
	exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package		CodeIgniter
 * @author		ExpressionEngine Dev Team
 * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license		http://codeigniter.com/user_guide/license.html
 * @link		http://codeigniter.com
 * @since		Version 1.0
 * @filesource
 */
// ------------------------------------------------------------------------

/**
 * CodeIgniter Config Class
 *
 * This class contains functions that enable config files to be managed
 *
 * @package		CodeIgniter
 * @subpackage	Libraries
 * @category	Libraries
 * @author		ExpressionEngine Dev Team
 * @link		http://codeigniter.com/user_guide/libraries/config.html
 */
class CI_Config {

	/**
	 * List of all loaded config values
	 *
	 * @var array
	 */
	var $config = array();

	/**
	 * List of all loaded config files
	 *
	 * @var array
	 */
	var $is_loaded = array();

	/**
	 * List of paths to search when trying to load a config file
	 *
	 * @var array
	 */
	var $_config_paths = array(APPPATH);

	/**
	 * Constructor
	 *
	 * Sets the $config data from the primary config.php file as a class variable
	 *
	 * @access   public
	 * @param   string	the config file name
	 * @param   boolean  if configuration values should be loaded into their own section
	 * @param   boolean  true if errors should just return false, false if an error message should be displayed
	 * @return  boolean  if the file was successfully loaded or not
	 */
	function __construct() {
		$this->config = & get_config();
		log_message('debug', "Config Class Initialized");

		// Set the base_url automatically if none was provided
		if ($this->config['base_url'] == '') {
			if (isset($_SERVER['HTTP_HOST'])) {
				$base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
				$base_url .= '://' . $_SERVER['HTTP_HOST'];
				$base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
			} else {
				$base_url = 'http://localhost/';
			}

			$this->set_item('base_url', $base_url);
		}
	}

	// --------------------------------------------------------------------

	/**
	 * Load Config File
	 *
	 * @access	public
	 * @param	string	the config file name
	 * @param   boolean  if configuration values should be loaded into their own section
	 * @param   boolean  true if errors should just return false, false if an error message should be displayed
	 * @return	boolean	if the file was loaded correctly
	 */
	function load($file = '', $use_sections = TRUE, $fail_gracefully = FALSE, $config_path = 'config') {
		$file = ($file == '') ? 'config' : str_replace('.php', '', $file);
		$found = FALSE;
		$loaded = FALSE;

		//$check_locations = array($file);
		$check_locations = defined('ENVIRONMENT') ? array(ENVIRONMENT . '/' . $file, $file) : array($file);


		foreach ($this->_config_paths as $path) {
			foreach ($check_locations as $location) {
				$file_path = $path . $config_path . '/' . $location . '.php';

				if (in_array($file_path, $this->is_loaded, TRUE)) {
					$loaded = TRUE;
					continue 2;
				}

				if (file_exists($file_path)) {
					$found = TRUE;
					break;
				}
			}

			if ($found === FALSE) {
				continue;
			}

			$arr = include($file_path);
			if (is_array($arr) && !empty($arr)) {
				$config = $arr;
			}
			if (!isset($config) OR !is_array($config)) {
				if ($fail_gracefully === TRUE) {
					return FALSE;
				}
				show_error('Your ' . $file_path . ' file does not appear to contain a valid configuration array.');
			}
			if ($use_sections === TRUE) {
				if (isset($this->config[$file])) {
					$this->config[$file] = array_merge($this->config[$file], $config);
				} else {
					$this->config[$file] = $config;
				}
			} else {
				$this->config = array_merge($this->config, $config);
			}

			$this->is_loaded[] = $file_path;
			unset($config);

			$loaded = TRUE;
			log_message('debug', 'Config file loaded: ' . $file_path);
			break;
		}

		if ($loaded === FALSE) {
			if ($fail_gracefully === TRUE) {
				return FALSE;
			}
			show_error('The configuration file ' . $file . '.php does not exist.');
		}

		return $this->config[$file];
	}

	function loads($file = '', $config_path = 'platforms', $use_sections = TRUE, $fail_gracefully = FALSE) {
		$file = ($file == '') ? 'activity' : str_replace('.php', '', $file);
		//$file = defined('ENVIRONMENT') ? ENVIRONMENT . '/' . $file : $file;

		//从apc读取

		$configs = $this->load($file, $use_sections, $fail_gracefully, $config_path);

		//apc更新

		return $configs;
	}

	// --------------------------------------------------------------------

	/**
	 * Fetch a config file item
	 *
	 *
	 * @access	public
	 * @param	string	the config item name
	 * @param	string	the index name
	 * @param	bool
	 * @return	string
	 */
	function item($item, $index = '') {
		if ($index == '') {
			if (!isset($this->config[$item])) {
				return FALSE;
			}

			$pref = $this->config[$item];
		} else {
		
			if (!isset($this->config[$index]) && !$this->loads($index)) {
				return FALSE;
			}

			if (!isset($this->config[$index][$item])) {
				return FALSE;
			}

			$pref = $this->config[$index][$item];
		}

		return $pref;
	}

	function items($item, $index = '') {
		//apc


		$pref = $this->item($item, $index)	;

		return $pref;
	}

	// --------------------------------------------------------------------

	/**
	 * Fetch a config file item - adds slash after item (if item is not empty)
	 *
	 * @access	public
	 * @param	string	the config item name
	 * @param	bool
	 * @return	string
	 */
	function slash_item($item) {
		if (!isset($this->config[$item])) {
			return FALSE;
		}
		if (trim($this->config[$item]) == '') {
			return '';
		}

		return rtrim($this->config[$item], '/') . '/';
	}

	// --------------------------------------------------------------------

	/**
	 * Site URL
	 * Returns base_url . index_page [. uri_string]
	 *
	 * @access	public
	 * @param	string	the URI string
	 * @return	string
	 */
	function site_url($uri = '') {
		if ($uri == '') {
			return $this->slash_item('base_url') . $this->item('index_page');
		}

		if ($this->item('enable_query_strings') == FALSE) {
			$suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix');
			return $this->slash_item('base_url') . $this->slash_item('index_page') . $this->_uri_string($uri) . $suffix;
		} else {
			return $this->slash_item('base_url') . $this->item('index_page') . '?' . $this->_uri_string($uri);
		}
	}

	// -------------------------------------------------------------

	/**
	 * Base URL
	 * Returns base_url [. uri_string]
	 *
	 * @access public
	 * @param string $uri
	 * @return string
	 */
	function base_url($uri = '') {
		return $this->slash_item('base_url') . ltrim($this->_uri_string($uri), '/');
	}

	// -------------------------------------------------------------

	/**
	 * Build URI string for use in Config::site_url() and Config::base_url()
	 *
	 * @access protected
	 * @param  $uri
	 * @return string
	 */
	protected function _uri_string($uri) {
		if ($this->item('enable_query_strings') == FALSE) {
			if (is_array($uri)) {
				$uri = implode('/', $uri);
			}
			$uri = trim($uri, '/');
		} else {
			if (is_array($uri)) {
				$i = 0;
				$str = '';
				foreach ($uri as $key => $val) {
					$prefix = ($i == 0) ? '' : '&';
					$str .= $prefix . $key . '=' . $val;
					$i++;
				}
				$uri = $str;
			}
		}
		return $uri;
	}

	// --------------------------------------------------------------------

	/**
	 * System URL
	 *
	 * @access	public
	 * @return	string
	 */
	function system_url() {
		$x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH));
		return $this->slash_item('base_url') . end($x) . '/';
	}

	// --------------------------------------------------------------------

	/**
	 * Set a config file item
	 *
	 * @access	public
	 * @param	string	the config item key
	 * @param	string	the config item value
	 * @return	void
	 */
	function set_item($item, $value) {
		$this->config[$item] = $value;
	}

	// --------------------------------------------------------------------

	/**
	 * Assign to Config
	 *
	 * This function is called by the front controller (CodeIgniter.php)
	 * after the Config class is instantiated.  It permits config items
	 * to be assigned or overriden by variables contained in the index.php file
	 *
	 * @access	private
	 * @param	array
	 * @return	void
	 */
	function _assign_to_config($items = array()) {
		if (is_array($items)) {
			foreach ($items as $key => $val) {
				$this->set_item($key, $val);
			}
		}
	}

}

// END CI_Config class

/* End of file Config.php */
/* Location: ./system/core/Config.php */
